Material UI is a Material Design library made for React.
It’s a set of React components that have Material Design styles.
In this article, we’ll look at how to add text fields with Material UI.
Sizes
We can change the size of a text field with the size
prop.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
return (
<div className="App">
<TextField label="Size" id="small" defaultValue="Small" size="small" />
</div>
);
}
to add a text field with the size small
.
Layout
We can layout our text fields our way.
To do that, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
import { makeStyles } from "@material-ui/core/styles";
const useStyles = makeStyles(theme => ({
root: {
display: "flex",
flexWrap: "wrap"
},
textField: {
marginLeft: theme.spacing(1),
marginRight: theme.spacing(1),
width: "25ch"
}
}));
export default function App() {
const classes = useStyles();
return (
<>
<div>
<TextField
id="filled-full-width"
label="Label"
style={{ margin: 8 }}
placeholder="Placeholder"
helperText="Full width!"
fullWidth
margin="normal"
InputLabelProps={{
shrink: true
}}
variant="filled"
/>
<TextField
label="None"
id="filled-margin-none"
defaultValue="foo"
className={classes.textField}
helperText="foo"
/>
<TextField
label="Dense"
style={{ margin: 3 }}
id="filled-margin-dense"
defaultValue="bar"
className={classes.textField}
helperText="bar"
margin="dense"
/>
</div>
</>
);
}
to add text fields.
We have one full-width text field at the top and 2 shorter ones at the bottom.
They have the usual props, which have the helperText
for the hint.
margin
have the margin.
We also have some styles to change the margins.
className
have the class names.
placeholder
have the placeholder for the text fields.
variant
can be filled or not.
margin
can be smaller than the default with dense
.
Uncontrolled vs Controlled
Text fields can be uncontrolled, which means that it doesn’t have any state attached to it.
Or it can be controlled, which means that it has state attached to it.
To make a controlled text field, we can add the value
and onChange
props to the TextField
.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
const [name, setName] = React.useState("james");
const handleChange = event => {
setName(event.target.value);
};
return (
<>
<div>
<TextField
id="standard-name"
label="Name"
value={name}
onChange={handleChange}
/>
</div>
</>
);
}
We have the name
state which is passed into the value
prop.
And the handleChange
function which is passed into the onChange
prop.
Then when we type something in, the handleChange
function will run and call setName
to update the name
state.
Components
A TextField
is made of smaller components.
They include FormControl
, Input
, FilledInput
, InputLabel
, OutlinedInput
and FormHelperText
.
For instance, we can substitute a TextField
with:
import React from "react";
import FormControl from "@material-ui/core/FormControl";
import Input from "@material-ui/core/Input";
import InputLabel from "@material-ui/core/InputLabel";
export default function App() {
const [name, setName] = React.useState("james");
const handleChange = event => {
setName(event.target.value);
};
return (
<>
<div>
<FormControl>
<InputLabel htmlFor="input">Name</InputLabel>
<Input id="input" value={name} onChange={handleChange} />
</FormControl>
</div>
</>
);
}
We have an Input
for the input box and InputLabel
for the label for the input box.
To add hint text, we can use the FormHelperText
component:
import React from "react";
import FormControl from "@material-ui/core/FormControl";
import Input from "@material-ui/core/Input";
import InputLabel from "@material-ui/core/InputLabel";
import FormHelperText from "@material-ui/core/FormHelperText";
export default function App() {
const [name, setName] = React.useState("james");
const handleChange = event => {
setName(event.target.value);
};
return (
<>
<div>
<FormControl>
<InputLabel htmlFor="input">Name</InputLabel>
<Input id="input" value={name} onChange={handleChange} />
<FormHelperText>enter your name</FormHelperText>
</FormControl>
</div>
</>
);
}
We can also use the OutlinedInput
and FilledInput
components to add input boxes with those varieties:
import React from "react";
import FormControl from "@material-ui/core/FormControl";
import OutlinedInput from "@material-ui/core/OutlinedInput";
import InputLabel from "@material-ui/core/InputLabel";
import FormHelperText from "@material-ui/core/FormHelperText";
export default function App() {
const [name, setName] = React.useState("james");
const handleChange = event => {
setName(event.target.value);
};
return (
<>
<div>
<FormControl>
<InputLabel htmlFor="input">Name</InputLabel>
<OutlinedInput
id="input"
value={name}
onChange={handleChange}
label="Name"
/>
<FormHelperText>enter your name</FormHelperText>
</FormControl>
</div>
</>
);
}
to add an input box with the outline to the box.
And we can use the FilledInput
to add an input box with the background:
import React from "react";
import FormControl from "@material-ui/core/FormControl";
import FilledInput from "@material-ui/core/FilledInput";
import InputLabel from "@material-ui/core/InputLabel";
import FormHelperText from "@material-ui/core/FormHelperText";
export default function App() {
const [name, setName] = React.useState("james");
const handleChange = event => {
setName(event.target.value);
};
return (
<>
<div>
<FormControl>
<InputLabel htmlFor="input">Name</InputLabel>
<FilledInput id="input" value={name} onChange={handleChange} />
<FormHelperText>enter your name</FormHelperText>
</FormControl>
</div>
</>
);
}
Conclusion
A TextField
is composed of many form components.
Therefore, we can add those instead of a TextField
.
We can also make a text field and controller input.